package com.green.common.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;


/**
 * 下拉框工具类
 * @author xsq
 *
 */
public class OptionUtil {
	
	/**
	 * 把一个对象转换成OptionObj对象
	 * @param obj
	 * @param nameField 对应OptionObj 的name
	 * @param valueField 对应OptionObj 的value
	 * @return
	 * @throws Exception 
	 * @throws  
	 */
	public static OptionObj objectToOptionObj(Object obj,String nameField,String valueField) throws  Exception
	{
		if(null==obj)
			return null;
	    Class c=obj.getClass();
	    Field[] fields =c.getDeclaredFields();
	    Field nameF=null;
	    Field valueF=null;
	    //(fields=c.getDeclaredFields())!=null&&fields.length>0
	    while(true)
	    {
	    		boolean b=false;
	    		for (int i = 0; i < fields.length; i++) {
	    			b=false;
					if(nameField!=null&&fields[i].getName().equalsIgnoreCase(nameField))
					{
						nameF=fields[i];
						nameField=null;
						b=true;
					}
					
					if(valueField!=null&&fields[i].getName().equalsIgnoreCase(valueField))
					{
						valueF=fields[i];
						valueField=null;
						b=true;
					}
					
					if(true==b)
					{
						if(null==nameField&&valueField==null)
				    	{
				    		break;
				    	}
					}
				}
	    		c=c.getSuperclass();
	    		if(Object.class==c)
	    		{
	    			break;
	    		}
	    		fields =c.getDeclaredFields();
	    }
	    
	    
	    if(null==nameF||null==valueF)
		{
	    	    StringBuilder msg=new StringBuilder("在(");
	    	    msg.append(obj.getClass().getName()).append(")类中找不到:");
	    	   
			    if(null==nameF)
			    {
			    	msg.append(nameField);
			    }else
			    {
			    	msg.append(valueField);
			    }
			    msg.append(" 这个字段");
				throw new Exception(msg.toString());
		}else
		{
			nameF.setAccessible(true);
			valueF.setAccessible(true);
			
			
			String value= valueF.get(obj)+"";
			String name=nameF.get(obj)+"";
			
			return new OptionObj(value, name);
		}
	}
	
	/**
	 * 批量转换
	 * @param c
	 * @param nameField
	 * @param valueField
	 * @return
	 * @throws Exception
	 */
	public static List<OptionObj> collectionToOptionObj(Collection c,String nameField,String valueField) throws Exception
	{
		if(null==c&&c.size()<0)
			return null;
		Iterator iter=c.iterator();
		Object obj=null;
		List<OptionObj> list=new ArrayList<OptionObj>();
	    while(iter.hasNext())
	    {
	    	  obj=iter.next();
	    	  list.add(objectToOptionObj(obj, nameField, valueField));
	    }
	    return list;
	}
	
	/**
	 * 把一个枚举类转换成OptionObj的集合
	 * @param enumCls
	 * @param swap 是不是交换
	 * @return
	 * @throws Exception
	 */
	public static List<OptionObj> enumToOptionObj(Class enumCls,boolean swap) throws Exception
	{
		if(null==enumCls||!enumCls.isEnum())
		{
			return null;
		}
		List<OptionObj> list=new ArrayList();
		 
		Field[] fs=enumCls.getFields();
		
		Method m=enumCls.getMethod("getAlias");
		
		String value="";
		String  name="";
		Object enumObj=null;
		for (int i = 0; i < fs.length; i++) {
			value=fs[i].getName();
			enumObj=Enum.valueOf(enumCls, value);
			name=(String) m.invoke(enumObj);
			if(true==swap)
			{
				list.add(new OptionObj( name,value));
			}else
			{
				list.add(new OptionObj(value, name));
			}
			
		}
		return list;
	}
	
    /**
     * 对应 下拉框的一项 （option）
     * @author Administrator
     *
     */
	public static class OptionObj{
    	private String value;
    	private String text;

		public OptionObj(String value, String text) {
			this();
			this.value = value;
			this.text = text;
		}
		
		public OptionObj() {
			super();
		}
		public String getValue() {
			return value;
		}
		public void setValue(String value) {
			this.value = value;
		}
		public String getText() {
			return text;
		}
		public void setText(String text) {
			this.text = text;
		}

		@Override
		public String toString() {
			return this.text+" "+this.value;
		}
    }
   
}
